/*
 * @lc app=leetcode.cn id=287 lang=cpp
 *
 * [287] 寻找重复数
 */

// @lc code=start
class Solution {
public:
    int findDuplicate(vector<int>& nums) {
        //只存在一个重复数
        //并且 nums 中的数 属于 [1, n]

        //相当于环形链表, 需要找出环的入口
        //Floyd 判圈算法

        int slow = 0, fast = 0;

        //得到环内相遇点
        do {
            slow = nums[slow];
            fast = nums[nums[fast]];
        } while (slow != fast);

        //寻找入口
        slow = 0;
        for (; slow != fast;) {
            slow = nums[slow];
            fast = nums[fast];
        }

        return slow;
    }
};
// @lc code=end

